package glavni;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JToolBar;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.filechooser.FileFilter;
import faktorI.FaktorIRadnaPovrs;

public class Menadzer extends JFrame {

	private RadnaPovrs radnaPovrs;
	private JPanel toolbars;
	private JToolBar povrsToolBar, menadzerToolBar;
	private JMenuItem ucitaj, napred, nazad, pokreni, zavrsi, snimi, snimikao;
	private String fajl;

	public RadnaPovrs dohvatiRadnuPovrs() {
		return radnaPovrs;
	}

	public void postaviRadnuPovrs(RadnaPovrs r) {
		if (radnaPovrs != null)
			remove(radnaPovrs);
		radnaPovrs = r;
		add(radnaPovrs, BorderLayout.CENTER);
		validate();
	}

	public Menadzer() {
		super("Ekspertski sistemi");
		try {
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		} catch (ClassNotFoundException ex) {
			Logger.getLogger(this.toString()).log(Level.SEVERE, null, ex);
		} catch (InstantiationException ex) {
			Logger.getLogger(this.toString()).log(Level.SEVERE, null, ex);
		} catch (IllegalAccessException ex) {
			Logger.getLogger(this.toString()).log(Level.SEVERE, null, ex);
		} catch (UnsupportedLookAndFeelException ex) {
			Logger.getLogger(this.toString()).log(Level.SEVERE, null, ex);
		}
		fajl = null;
		uredi();
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
	}

	private void uredi() {
		setState(JFrame.NORMAL);
		Toolkit toolkit = Toolkit.getDefaultToolkit();
		Dimension dimension = toolkit.getScreenSize();
		setSize(dimension);
		JMenuBar menubar = new JMenuBar();
		JMenu simulator = new JMenu("Simulator");
		simulator.setMnemonic(KeyEvent.VK_S);
		JMenuItem novi = new MyMenuItem("Izaberi", KeyEvent.VK_I);
		novi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_I,
				ActionEvent.CTRL_MASK));
		JMenuItem izlaz = new MyMenuItem("Izlaz", KeyEvent.VK_Z);
		izlaz.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z,
				ActionEvent.CTRL_MASK));
		ucitaj = new MyMenuItem("Otvori fajl...", KeyEvent.VK_O);
		ucitaj.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,
				ActionEvent.CTRL_MASK));
		snimi = new MyMenuItem("Snimi", KeyEvent.VK_S);
		snimi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,
				ActionEvent.CTRL_MASK));
		snimikao = new MyMenuItem("Snimi kao...", KeyEvent.VK_K);
		snimikao.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_K,
				ActionEvent.CTRL_MASK));
		JMenu sim = new JMenu("Simulacija");
		sim.setMnemonic(KeyEvent.VK_L);
		pokreni = new MyMenuItem("Na pocetak", KeyEvent.VK_P);
		pokreni.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_HOME,
				ActionEvent.CTRL_MASK));
		napred = new MyMenuItem("Korak napred", KeyEvent.VK_N);
		napred.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT,
				ActionEvent.CTRL_MASK));
		nazad = new MyMenuItem("Korak nazad", KeyEvent.VK_Z);
		nazad.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT,
				ActionEvent.CTRL_MASK));
		zavrsi = new MyMenuItem("Na kraj", KeyEvent.VK_K);
		zavrsi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_END,
				ActionEvent.CTRL_MASK));
		pokreni.setEnabled(false);
		napred.setEnabled(false);
		nazad.setEnabled(false);
		zavrsi.setEnabled(false);
		simulator.add(novi);
		simulator.add(ucitaj);
		simulator.add(snimi);
		simulator.add(snimikao);
		simulator.addSeparator();
		simulator.add(izlaz);
		menubar.add(simulator);
		sim.add(pokreni);
		sim.add(napred);
		sim.add(nazad);
		sim.add(zavrsi);
		menubar.add(sim);
		setJMenuBar(menubar);
		setLayout(new BorderLayout());
		toolbars = new JPanel();
		toolbars.setLayout(new FlowLayout(FlowLayout.LEFT));
		toolbars.add(menadzerToolBar = new MenadzerToolBar(this));
		add(toolbars, BorderLayout.NORTH);
		zabraniSnimi();
		zabraniOtvori();
		zabraniNaPocetak();
		zabraniNaKraj();
		zabraniKorakNapred();
		zabraniKorakNazad();
	}

	private class MyMenuItem extends JMenuItem implements ActionListener {

		public MyMenuItem(String name, int key) {
			super(name, key);
			addActionListener(this);
		}

		public void actionPerformed(ActionEvent e) {
			if (e.getActionCommand().equals("Izaberi"))
				openNewDialog();
			else if (e.getActionCommand().equals("Izlaz"))
				System.exit(0);
			else if (e.getActionCommand().equals("Otvori fajl..."))
				openOpenDialog();
			else if (e.getActionCommand().equals("Snimi"))
				snimiAkcija();
			else if (e.getActionCommand().equals("Snimi kao..."))
				openSaveDialog();
			else if (e.getActionCommand().equals("Korak napred"))
				korakNapredAkcija();
			else if (e.getActionCommand().equals("Korak nazad"))
				korakNazadAkcija();
			else if (e.getActionCommand().equals("Na pocetak"))
				naPocetakAkcija();
			else if (e.getActionCommand().equals("Na kraj"))
				naKrajAkcija();
		}

	}

	void openNewDialog() {
		Object res = JOptionPane.showInputDialog(this,
				"Izaberite tip simulacije", "Simulator",
				JOptionPane.QUESTION_MESSAGE, null,
				new Object[] { "faktor izvesnosti" }, "faktor izvesnosti");
		if (res != null) {
			if (res.equals("faktor izvesnosti"))
				postaviRadnuPovrs(new FaktorIRadnaPovrs(this));
			if (povrsToolBar != null)
				toolbars.remove(povrsToolBar);
			toolbars.add(povrsToolBar = radnaPovrs.dohvatiToolBar());
			validate();
			fajl = null;
			dozvoliOtvori();
			radnaPovrs.iscrtaj();
		}
	}

	void openOpenDialog() {
		JFileChooser c = new JFileChooser();
		FileFilter ff = radnaPovrs.dohvatiFilter();
		if (ff != null) {
			c.removeChoosableFileFilter(c.getChoosableFileFilters()[0]);
			c.setFileFilter(ff);
		}
		int res = c.showOpenDialog(Menadzer.this);
		if (res == JFileChooser.APPROVE_OPTION) {
			fajl = c.getSelectedFile().getAbsolutePath();
			setTitle("Eksperski sistemi - " + fajl);
			radnaPovrs.dohvatiSimulaciju().ucitaj(fajl);
			radnaPovrs.iscrtaj();
			dozvoliSnimi();
		}
	}

	void openSaveDialog() {
		JFileChooser c = new JFileChooser();
		FileFilter ff = radnaPovrs.dohvatiFilter();
		if (ff != null) {
			c.removeChoosableFileFilter(c.getChoosableFileFilters()[0]);
			c.setFileFilter(ff);
		}
		int res = c.showSaveDialog(Menadzer.this);
		if (res == JFileChooser.APPROVE_OPTION) {
			fajl = c.getSelectedFile().getAbsolutePath();
			if (!fajl.endsWith("." + radnaPovrs.dohvatiEkstenziju()))
				fajl = fajl + "." + radnaPovrs.dohvatiEkstenziju();
			setTitle("Eksperski sistemi - " + fajl);
			radnaPovrs.dohvatiSimulaciju().snimi(fajl);
			radnaPovrs.iscrtaj();
			dozvoliSnimi();
		}
	}

	void snimiAkcija() {
		if (fajl != null)
			radnaPovrs.dohvatiSimulaciju().snimi(fajl);
		else
			openSaveDialog();
		radnaPovrs.iscrtaj();
	}

	void korakNapredAkcija() {
		radnaPovrs.dohvatiSimulaciju().korakNapred();
		radnaPovrs.iscrtaj();
	}

	void korakNazadAkcija() {
		radnaPovrs.dohvatiSimulaciju().korakNazad();
		radnaPovrs.iscrtaj();
	}

	void naPocetakAkcija() {
		radnaPovrs.dohvatiSimulaciju().naPocetak();
		radnaPovrs.iscrtaj();
	}

	void naKrajAkcija() {
		radnaPovrs.dohvatiSimulaciju().naKraj();
		radnaPovrs.iscrtaj();
	}

	public void dozvoliNaPocetak() {
		pokreni.setEnabled(true);
		((MenadzerToolBar) menadzerToolBar).dozvoliNaPocetak();
	}

	public void zabraniNaPocetak() {
		pokreni.setEnabled(false);
		((MenadzerToolBar) menadzerToolBar).zabraniNaPocetak();
	}

	public void dozvoliNaKraj() {
		zavrsi.setEnabled(true);
		((MenadzerToolBar) menadzerToolBar).dozvoliNaKraj();
	}

	public void zabraniNaKraj() {
		zavrsi.setEnabled(false);
		((MenadzerToolBar) menadzerToolBar).zabraniNaKraj();
	}

	public void dozvoliKorakNapred() {
		napred.setEnabled(true);
		((MenadzerToolBar) menadzerToolBar).dozvoliKorakNapred();
	}

	public void zabraniKorakNapred() {
		napred.setEnabled(false);
		((MenadzerToolBar) menadzerToolBar).zabraniKorakNapred();
	}

	public void dozvoliKorakNazad() {
		nazad.setEnabled(true);
		((MenadzerToolBar) menadzerToolBar).dozvoliKorakNazad();
	}

	public void zabraniKorakNazad() {
		nazad.setEnabled(false);
		((MenadzerToolBar) menadzerToolBar).zabraniKorakNazad();
	}

	public void dozvoliOtvori() {
		ucitaj.setEnabled(true);
		((MenadzerToolBar) menadzerToolBar).dozvoliOtvori();
	}

	public void zabraniOtvori() {
		ucitaj.setEnabled(false);
		((MenadzerToolBar) menadzerToolBar).zabraniOtvori();
	}

	public void dozvoliSnimi() {
		snimi.setEnabled(true);
		snimikao.setEnabled(true);
		((MenadzerToolBar) menadzerToolBar).dozvoliSnimi();
	}

	public void zabraniSnimi() {
		snimi.setEnabled(false);
		snimikao.setEnabled(false);
		((MenadzerToolBar) menadzerToolBar).zabraniSnimi();
	}

	public static void main(String[] args) {
		new Menadzer();
	}

}
